home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
utils
/
wnx1091.lzh
/
START.S
< prev
next >
Wrap
Text File
|
1991-10-15
|
12KB
|
471 lines
DEBUG EQU 0 1 = Debugging, 0 = Final Revision
IFEQ DEBUG
OPT O+,W-,X-
ELSEIF
OPT O+,W-,X+
ENDC
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
WNX=0 0 if can run as WNX, otherwise not!
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* MACROS -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
object macro
move.w \2,\4
mulu #ob_sizeof,\4
lea 0(\1,\4),\3
endm
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
RSRESET
ob_next rs.w 1
ob_head rs.w 1
ob_tail rs.w 1
ob_type rs.w 1
ob_flags rs.w 1
ob_state rs.w 1
ob_spec rs.l 1
ob_x rs.w 1
ob_y rs.w 1
ob_w rs.w 1
ob_h rs.w 1
ob_sizeof rs.w 0
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
RSRESET
dta_reserved rs.b 21
dta_attrib rs.b 1
dta_time rs.b 2
dta_date rs.b 2
dta_size rs.b 4
dta_name rs.b 13
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
RSRESET
MAGIC rs.w 1
TSIZE rs.l 1
DSIZE rs.l 1
BSIZE rs.l 1
SSIZE rs.l 1
SELFRESERVED rs.w 5
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
include d:\wnx_dev\gemmacro.s
include d:\wnx_dev\newmacro.s
include d:\wnx_dev\xesmacro.s
*include d:\wnx_dev\linea.s
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* START *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
START
lea START,a5 get the address of this code
tst.l -220(a5) is p_parent = 0?
cmp.l #"XES",-216(a5) is p_reserved = "XES"
beq.s start_wnx no, so do .PRG startup code
move.l a0,d0
tst.l d0 is a0 <> 0?
bne start_acc yes, so .ACC!
bra start_prg no, so .PRG...
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
start_wnx
IFEQ WNX = 0
* first, make a call to initialize. Pass the address of your RSC.
move.w #-1,app app = -1 for WNXes
xes_init #parmblk
move.w WNX_grafhandle,current_handle
xes_rsrcinit #-1,#2,#resource1
move.l WNX_out+6,a0 got the address!
move.l a0,treeptr
move.l (a0),rsrcptr
xes_genv get screen settings...
move.w WNX_out+12,scalex
move.w WNX_out+14,scaley
xes_pwindow get window settings...
movem.w WNX_out+8,d4-d7
movem.w d4-d7,minx
move.w #%000000,WNX_flags
*move.w #0001,WNX_tcount
*move.l #maintimer,WNX_troutine
*move.l #mainbutton,WNX_broutine
*move.l #mainbutton,tempbutton
*move.l #mainmessage,WNX_mroutine
*move.l #mainredraw,WNX_rroutine
move.l #termroutine,WNX_termroutine
xes_submit
ELSEIF
form_alert #1,#cannotrunaswnx
move.l #START-358,-(a7) ptr to default parmblk
move.w #39,-(a7)
xes_call
ENDC
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
start_prg
move.w #1,app PRGs,etc... have app = 1
move.l 4(a7),a3 base page
move.l #mystack,a7
move.l $c(a3),d0 text len
add.l $14(a3),d0 data len
add.l $1c(a3),d0 BSS len
add.l #$100,d0 basepage
move.l d0,-(sp)
move.l a3,-(sp)
clr.w -(sp)
move.w #$4a,-(sp)
trap #1 shrink memory
lea 12(sp),sp
bra.s go_prg_or_acc
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
start_acc
move.w #0,app ACCs have app = 0
move.l #mystack,a7 must have a stack!
go_prg_or_acc dc.w $a000 line-A init
move.l a0,a_init
appl_init
move.w d0,ap_id store the application id
graf_handle
move.w d0,current_handle Desktop's VDI handle
bsr get_scalexy
move.w #2,rsc_scale_flag
move.l #resource1,d1
bsr rsrc_include
move.l result0,rsrcptr
tst.w app program or accessory?
bne.s go_prg program!
menu_register ap_id,#mymenu
jmp auto_acc
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
go_prg
* start by opening a virtual workstation
lea intin,a0
moveq #10-1,d0 -1 for DBF
.fill move.w #1,(a0)+ most params are 1
dbf d0,.fill
move.w #2,(a0)+ use RC system
v_opnvwk open it
wind_get #0,#4 find working area...
movem.w int_out+2,d0-d3
movem.w d0-d3,minx
* gets the resolution of the system!
_getrez
move.w d0,origmode
_physbase
move.l d0,orig1
_logbase
move.l d0,orig2
* set the mouse to an arrow
graf_mouse #0
jmp PROGRAM
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- MAIN *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
auto_acc
* Any autoboot DA code goes here...
* We conclude by getting into the accessory loop in wait4event...
* load the RSC
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
wait4event
* We wait for GEM to say this DA is open...
evnt_mesag #messagebuf
move.l #messagebuf,a0
move.w (a0),d0
cmp.w #40,d0
beq BEGIN
* check for other GEM messages here...
bra.s wait4event
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
get_scalexy
vqt_fontinfo
movem.w int_out+2,d0-d1
* fixes MultiDesk incompatibility by sensing when 6x6 font is in!
._h divu.w #8,d0
bne ._w
moveq #1,d0
._w divu.w #8,d1
bne ._done
moveq #1,d1
._done movem.w d0-d1,scalex
rts
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
rsc_scale_flag dc.l 0
result0 dc.l 0
result1 dc.l 0
result2 dc.l 0
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
rsrc_include
* fixes up a resource tree using mystic arts. Actually fixes multiple
* resource trees within one .RSC file!
* in: d1 = ptr to binary .RSC file in memory.
*
* out: result0 = ptr to first tree in resource.
* result1 = ptr to tree list.
* result2 = number of trees in resource.
*
* assume to smash all registers.
*
tst.l d1
beq.w rsrc_null
move.l d1,a2 a2 = ptr to binary RSC
move.l d1,d7 d7 = a2
move.w 20(a2),d2 d2 = number of objects in RSC
subq.w #1,d2 d2 = d2 - 1
moveq #0,d0
move.w 2(a2),d0 d0 = offset to first tree
add.l d0,a2 a2 = ptr to first tree...
move.l a2,result0 result0 = ptr to first tree |X|
fixloop
object a2,d2,a0,d0
move.w ob_type(a0),d0 d0 = object type
move.l ob_spec(a0),d1 d1 = object spec field.
cmp.w #20,d0
beq.s endfixloop
cmp.w #25,d0
beq.s endfixloop
cmp.w #27,d0
beq.s endfixloop
add.l d7,d1
move.l d1,ob_spec(a0) fixes up ob_spec entry
move.l d1,a1
add.l d7,(a1)+ fixes up a field
cmp.w #23,d0
beq.s endfixloop
cmp.w #24,d0
beq.s endfixloop
add.l d7,(a1)+ fixes up two fields...
add.l d7,(a1)+
endfixloop
lea 16(a0),a0 point at X field
move.w scalex,d0 scale of x to 8x8 font
move.w scaley,d1 scale of y to 8x8 font
move.w #1,d6 fix (1+1)*2 entries (X,Y,W,H)
fix_XYWH
.XW moveq #0,d4
moveq #0,d5
move.b (a0),d4 d4 = 0-7 pixel coord
tst.w rsc_scale_flag scale pixel coords?
beq.s .skip1 no.
mulu d0,d4 d4 = d4 * d0 if flag set.
.skip1 move.b 1(a0),d5 d5 = char coord
mulu #8,d5
cmp.w #2,rsc_scale_flag scale char coords?
bne.s .skip1b no.
mulu d0,d5 d5 = d5 * d0 if flag set.
.skip1b add.w d4,d5
move.w d5,(a0)+
.YH moveq #0,d4
moveq #0,d5
move.b (a0),d4 0-7 pixel coord
tst.w rsc_scale_flag if not set, no conversion
beq.s .skip2
mulu d1,d4 d4 = d4 * d0 if flag set
.skip2 move.b 1(a0),d5 d5 = char coord
mulu #8,d5
cmp.w #2,rsc_scale_flag scale char coords?
bne.s .skip2b no.
mulu d1,d5
.skip2b add.w d4,d5
move.w d5,(a0)+
dbra.w d6,fix_XYWH
dbra.w d2,fixloop keep fixin' 'em!
fixtrees move.l d7,a0 a0 = ptr to binary resource
move.w 22(a0),d6 d6 = number of trees
move.w d6,result2 result2.W = number of trees |X|
move.l d7,a1 a1 = d7 = a0
moveq #0,d0
move.w 18(a0),d0 d0 = offset to tree entries
add.l d0,a1 a1 = ptr to tree entries
move.l